import { DataFrame, Series } from './pandas'
import * as systemdemo from '@/components/ts/systemdemo'

let app = window.Application


/**
 * 将DataFrame数据写入Excel工作表
 * @param df DataFrame对象
 * @param sheet_name 工作表名称
 * @param start_row 起始行（从1开始）
 * @param start_col 起始列（从1开始）
 * @param index 是否写入行索引标题
 * @param title 是否写入列标题
 */
function df_to_excel(df: any, sheet_name: string, start_row: number = 1, start_col: number = 1, index: boolean = true, title: boolean = true) {
  // 获取当前活动工作簿
  let workbook = app.ActiveWorkbook

  // 查找或创建指定名称的工作表
  let worksheet
  if (systemdemo.exist_sheet(sheet_name)) {
    worksheet = systemdemo.get_sheet_by_name(sheet_name)
  } else {
    // 如果工作表不存在则创建
    let sheets = workbook.Worksheets
    worksheet = workbook.Worksheets.Add(sheets.Item(sheets.Count))
    worksheet.Name = sheet_name
  }

  // 获取DataFrame的行列数
  const [rows, cols] = df.shape

  // 计算数据在Excel中的实际起始位置（Excel行号和列号从1开始）
  let data_start_row = start_row
  let data_start_col = start_col

  // 如果需要写入列标题，则数据起始行需要下移
  if (title) {
    data_start_row += 1
  }

  // 如果需要写入行索引，则数据起始列需要右移
  if (index) {
    data_start_col += 1
  }

  // 写入列标题
  if (title) {
    for (let j = 0; j < cols; j++) {
      const columnName = df.columns[j]
      worksheet.Cells.Item(data_start_row - 1, data_start_col + j).Value2 = columnName
    }
  }

  // 写入行索引和数据
  for (let i = 0; i < rows; i++) {
    // 写入行索引
    if (index) {
      const rowIndex = df.index[i]
      worksheet.Cells.Item(data_start_row + i, data_start_col - 1).Value2 = rowIndex
    }

    // 写入数据
    for (let j = 0; j < cols; j++) {
      const value = df.iloc(i, j)
      worksheet.Cells.Item(data_start_row + i, data_start_col + j).Value2 = value
    }
  }
}

/**
 * 从Excel工作表中读取数据创建DataFrame
 * @param sheet_name 工作表名称
 * @param start_row 起始行（从1开始）
 * @param start_col 起始列（从1开始）
 * @param index 是否包含行索引
 * @param col 是否包含列标题
 * @param end_row 结束行（从1开始），默认为工作表的最后一行
 * @param end_col 结束列（从1开始），默认为工作表的最后一列
 */
function df_from_excel(sheet_name: string, start_row: number = undefined, start_col: number = undefined, index: boolean = true, col: boolean = true, end_row?: number, end_col?: number): DataFrame {
  // 获取指定名称的工作表
  let worksheet = systemdemo.get_sheet_by_name(sheet_name)
  if (!worksheet) {
    throw new Error(`工作表 "${sheet_name}" 不存在`)
  }

  const r = systemdemo.getUsedRangeOfSheet(sheet_name)
  start_row = start_row || r.startRow
  start_col = start_col || r.startCol
  const lastRow = end_row || r.endRow
  const lastCol = end_col || r.endCol

  // 获取工作表中数据区域的边界
  // console.log(`start_row = ${start_row}`)
  // console.log(`start_col = ${start_col}`)
  // console.log(`lastRow = ${lastRow}`)
  // console.log(`lastCol = ${lastCol}`)

  // 读取数据区域
  const data: any[][] = []


  for (let i = start_row; i <= lastRow; i++) {
    const row: any[] = []
    for (let j = start_col; j <= lastCol; j++) {
      try {
        const cell = worksheet.Cells.Item(i, j)
        if (cell !== null) {
          const cellValue = cell.Value2
          row.push(cellValue === undefined || cellValue === null ? '' : cellValue)
        } else {
          row.push('')
        }
      } catch (e) {
        row.push('')
      }
    }
    // console.log(`row${i} = ${row}`)
    data.push(row)
  }
  // console.log(data)
  let df = new DataFrame(data)
  // console.log(df)
  if (index) { // 将第一列设置为索引
    df = df.set_index(df.columns[0], true) // df.columns[0]为第1列的列名
  }
  if (col) { // 将第一行设置为列名
    df = df.set_axis(df.iloc(0), 1) // df.iloc(0)为第一行的数据
    df = df.drop(df.index[0], 'index') // index表示删除行
  }

  // 创建并返回DataFrame
  return df
}

export { df_to_excel, df_from_excel, DataFrame, Series }
